package edu.upc.clase.demo.dao.impl;

import edu.upc.clase.demo.dao.UsuarioDao;
import edu.upc.clase.demo.entity.UsuarioEnt;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
import org.springframework.stereotype.Repository;

/**
 *
 * @author gian
 */
@Repository
public class UsuarioDaoImpl extends SimpleJdbcDaoSupport implements UsuarioDao {

    private static Logger log = LoggerFactory.getLogger(UsuarioDaoImpl.class);

    @Autowired
    public UsuarioDaoImpl(DataSource dataSource) {
        log.info("Asignando el dataSource");
        setDataSource(dataSource);
    }

    @Override
    public Integer insertar(UsuarioEnt usuarioEnt) {

        getJdbcTemplate().update(
                "INSERT INTO bd_alfa_epe.usuario ("
                + "codigoUsuario,"
                + "nombreUsuario,"
                + "apellidoUsuario,"
                + "emailUsuario,"
                + "siteUsuario,"
                + "paisUsuario,"
                + "ciudadUsuario,"
                + "estadoUsuario,"
                + "direccionUsuario,"
                + "claveUsuario,"
                + "idUsuarioCreador"
                + ") VALUES "
                + "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
                usuarioEnt.getCodigoUsuario(),
                usuarioEnt.getNombreUsuario(),
                usuarioEnt.getApellidoUsuario(),
                usuarioEnt.getEmailUsuario(),
                usuarioEnt.getSiteUsuario(),
                usuarioEnt.getPaisUsuario(),
                usuarioEnt.getCiudadUsuario(),
                usuarioEnt.getEstadoUsuario(),
                usuarioEnt.getDireccionUsuario(),
                usuarioEnt.getClaveUsuario(),
                usuarioEnt.getIdUsuarioCreador());
        return getSimpleJdbcTemplate().queryForInt("select last_insert_id()");
    }

    @Override
    public void actualizar(UsuarioEnt usuarioEnt) {
        getJdbcTemplate().update(
                "UPDATE bd_alfa_epe.usuario "
                + "SET "
                + "codigoUsuario = ?,"
                + "nombreUsuario = ?,"
                + "apellidoUsuario = ?,"
                + "emailUsuario = ?,"
                + "siteUsuario = ?,"
                + "paisUsuario = ?,"
                + "ciudadUsuario = ?,"
                + "estadoUsuario = ?"
                + "direccionUsuario = ?,"
                + "claveUsuario = ?,"
                + "idUsuarioUpdate = ?,"
                + "fechaUpdate = ?"
                + "WHERE idUsuario = ?,",
                usuarioEnt.getCodigoUsuario(),
                usuarioEnt.getNombreUsuario(),
                usuarioEnt.getApellidoUsuario(),
                usuarioEnt.getEmailUsuario(),
                usuarioEnt.getSiteUsuario(),
                usuarioEnt.getPaisUsuario(),
                usuarioEnt.getCiudadUsuario(),
                usuarioEnt.getEstadoUsuario(),
                usuarioEnt.getDireccionUsuario(),
                usuarioEnt.getClaveUsuario(),
                usuarioEnt.getIdUsuarioUpdate(),
                usuarioEnt.getFechaUpdate());
    }

    @Override
    public void eliminar(UsuarioEnt usuarioEnt) {
        getJdbcTemplate().update(
                "UPDATE usuario "
                + "SET "
                + "estadoRegistro = 'A' "
                + "where id = ?",
                usuarioEnt.getEstadoRegistro(),
                usuarioEnt.getIdUsuario());
    }

    @Override
    public UsuarioEnt buscar(Integer id) {
        try {
            return getSimpleJdbcTemplate().queryForObject(
                    "SELECT "
                    + "idUsuario, "
                    + "codigoUsuario, "
                    + "nombreUsuario, "
                    + "apellidoUsuario, "
                    + "emailUsuario, "
                    + "siteUsuario, "
                    + "paisUsuario, "
                    + "ciudadUsuario, "
                    + "estadoUsuario, "
                    + "direccionUsuario, "
                    + "claveUsuario, "
                    + "puntuacionUsuario, "
                    + "estadoRegistro, "
                    + "idUsuarioCreador, "
                    + "fechaCreacion, "
                    + "idUsuarioUpdate, "
                    + "fechaUpdate "
                    + "FROM bd_alfa_epe.usuario "
                    + "WHERE estadoRegistro = 'V' "
                    + "AND idUsuario= ?",
                    new BeanPropertyRowMapper<UsuarioEnt>(UsuarioEnt.class), id);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }

    @Override
    public List<UsuarioEnt> buscarTodos() {
        return getSimpleJdbcTemplate().query(
                "SELECT "
                + "idUsuario, "
                + "codigoUsuario, "
                + "nombreUsuario, "
                + "apellidoUsuario, "
                + "emailUsuario, "
                + "siteUsuario, "
                + "paisUsuario, "
                + "ciudadUsuario, "
                + "estadoUsuario, "
                + "direccionUsuario, "
                + "claveUsuario, "
                + "puntuacionUsuario, "
                + "estadoRegistro, "
                + "idUsuarioCreador, "
                + "fechaCreacion, "
                + "idUsuarioUpdate, "
                + "fechaUpdate "
                + "FROM bd_alfa_epe.usuario "
                + "WHERE estadoRegistro = 'V'",
                new BeanPropertyRowMapper<UsuarioEnt>(UsuarioEnt.class));
    }

    @Override
    public UsuarioEnt buscar(String codUsuario) {
        try {
            return getSimpleJdbcTemplate().queryForObject(
                    "SELECT "
                    + "idUsuario, "
                    + "codigoUsuario, "
                    + "nombreUsuario, "
                    + "apellidoUsuario, "
                    + "emailUsuario, "
                    + "siteUsuario, "
                    + "paisUsuario, "
                    + "ciudadUsuario, "
                    + "estadoUsuario, "
                    + "direccionUsuario, "
                    + "claveUsuario, "
                    + "puntuacionUsuario, "
                    + "estadoRegistro, "
                    + "idUsuarioCreador, "
                    + "fechaCreacion, "
                    + "idUsuarioUpdate, "
                    + "fechaUpdate "
                    + "FROM bd_alfa_epe.usuario "
                    + "WHERE estadoRegistro = 'V' "
                    + "AND codigoUsuario = ?",
                    new BeanPropertyRowMapper<UsuarioEnt>(UsuarioEnt.class), codUsuario);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }

    @Override
    public List<UsuarioEnt> buscarPorNombre(String nombre) {
        try {
            Map<String, String> parametros = new HashMap<String, String>();
            parametros.put("nombreUsuario", "%" + nombre + "%");
            return getSimpleJdbcTemplate().query(
                    //"select * from usuarios where nombre like :nombre",
                    "SELECT "
                    + "idUsuario, "
                    + "codigoUsuario, "
                    + "nombreUsuario, "
                    + "apellidoUsuario, "
                    + "emailUsuario, "
                    + "siteUsuario, "
                    + "paisUsuario, "
                    + "ciudadUsuario, "
                    + "estadoUsuario, "
                    + "direccionUsuario, "
                    + "claveUsuario, "
                    + "puntuacionUsuario, "
                    + "estadoRegistro, "
                    + "idUsuarioCreador, "
                    + "fechaCreacion, "
                    + "idUsuarioUpdate, "
                    + "fechaUpdate "
                    + "FROM bd_alfa_epe.usuario "
                    + "WHERE CONCAT(nombreUsuario,', ',apellidoUsuario) LIKE :nombreUsuario ",
                    new BeanPropertyRowMapper<UsuarioEnt>(UsuarioEnt.class), parametros);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }
}